import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

class HelpPage extends StatefulWidget {
  const HelpPage({super.key});

  @override
  State<HelpPage> createState() => _HelpPageState();
}

class _HelpPageState extends State<HelpPage>
    with SingleTickerProviderStateMixin {
  late TabController _tabController;
  final ScrollController _scrollController = ScrollController();

  @override
  void initState() {
    super.initState();
    _tabController = TabController(length: 4, vsync: this);
  }

  @override
  void dispose() {
    _tabController.dispose();
    _scrollController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);

    return Scaffold(
      appBar: AppBar(
        title: const Text('帮助文档'),
        backgroundColor: theme.colorScheme.surface,
        foregroundColor: theme.colorScheme.onSurface,
        elevation: 0,
        bottom: TabBar(
          controller: _tabController,
          tabs: const [
            Tab(icon: Icon(Icons.settings), text: 'Nuitka参数'),
            Tab(icon: Icon(Icons.help_outline), text: '常见问题'),
            Tab(icon: Icon(Icons.school), text: '使用教程'),
            Tab(icon: Icon(Icons.tips_and_updates), text: '最佳实践'),
          ],
        ),
      ),
      body: TabBarView(
        controller: _tabController,
        children: [
          _buildNuitkaParametersTab(),
          _buildFAQTab(),
          _buildTutorialTab(),
          _buildBestPracticesTab(),
        ],
      ),
    );
  }

  Widget _buildNuitkaParametersTab() {
    return SingleChildScrollView(
      controller: _scrollController,
      padding: const EdgeInsets.all(16),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          _buildSectionCard('Nuitka 构建参数详解', Icons.build, [
            _buildParameterItem(
              '--standalone',
              '独立模式',
              '创建一个独立的可执行文件，包含所有依赖项。推荐用于分发应用程序。',
              '示例：nuitka --standalone main.py',
            ),
            _buildParameterItem(
              '--onefile',
              '单文件模式',
              '将所有内容打包到一个可执行文件中。启动稍慢但便于分发。',
              '示例：nuitka --onefile main.py',
            ),
            _buildParameterItem(
              '--windows-console-mode',
              'Windows控制台模式',
              '控制Windows应用程序的控制台行为。\n• disable: 无控制台窗口\n• force: 强制显示控制台',
              '示例：--windows-console-mode=disable',
            ),
            _buildParameterItem(
              '--enable-plugin',
              '启用插件',
              '启用特定的Nuitka插件来处理特殊模块。\n常用插件：numpy, matplotlib, tk-inter, qt-plugins',
              '示例：--enable-plugin=numpy,matplotlib',
            ),
            _buildParameterItem(
              '--include-module',
              '包含模块',
              '强制包含指定的Python模块，即使静态分析未检测到。',
              '示例：--include-module=requests,json',
            ),
            _buildParameterItem(
              '--follow-imports',
              '跟踪导入',
              '控制如何处理导入的模块。\n• --follow-import-to=MODULE\n• --nofollow-import-to=MODULE',
              '示例：--follow-import-to=mypackage',
            ),
            _buildParameterItem(
              '--output-dir',
              '输出目录',
              '指定构建输出的目录位置。',
              '示例：--output-dir=./build',
            ),
            _buildParameterItem(
              '--windows-icon-from-ico',
              'Windows图标',
              '为Windows可执行文件设置自定义图标。',
              '示例：--windows-icon-from-ico=icon.ico',
            ),
          ]),
          const SizedBox(height: 16),
          _buildSectionCard('优化参数', Icons.speed, [
            _buildParameterItem(
              '--lto=yes',
              '链接时优化',
              '启用链接时优化，可以显著减小文件大小和提升性能。',
              '推荐在发布版本中使用',
            ),
            _buildParameterItem(
              '--jobs=N',
              '并行编译',
              '设置并行编译的进程数，通常设置为CPU核心数。',
              '示例：--jobs=4',
            ),
            _buildParameterItem(
              '--assume-yes-for-downloads',
              '自动下载',
              '自动同意下载必要的依赖项，无需手动确认。',
              '适用于自动化构建',
            ),
          ]),
        ],
      ),
    );
  }

  Widget _buildFAQTab() {
    return SingleChildScrollView(
      padding: const EdgeInsets.all(16),
      child: Column(
        children: [
          _buildFAQCard(
            '构建失败：找不到模块',
            '问题：编译时提示某些模块找不到或导入失败。',
            '解决方案：\n1. 使用 --include-module 参数强制包含模块\n2. 检查虚拟环境是否正确激活\n3. 确保所有依赖都已安装\n4. 使用 --follow-import-to 跟踪特定包的导入',
          ),
          _buildFAQCard(
            '生成的exe文件过大',
            '问题：编译后的可执行文件体积过大。',
            '解决方案：\n1. 使用 --lto=yes 启用链接时优化\n2. 避免使用 --onefile，改用 --standalone\n3. 排除不必要的模块：--nofollow-import-to=MODULE\n4. 检查是否包含了不必要的数据文件',
          ),
          _buildFAQCard(
            '程序启动缓慢',
            '问题：使用 --onefile 模式时程序启动很慢。',
            '解决方案：\n1. 改用 --standalone 模式\n2. 优化代码，减少启动时的导入\n3. 使用延迟导入（lazy import）\n4. 考虑将大型依赖项外置',
          ),
          _buildFAQCard(
            'GUI应用显示控制台窗口',
            '问题：GUI应用程序运行时显示黑色控制台窗口。',
            '解决方案：\n使用 --windows-console-mode=disable 参数隐藏控制台窗口。',
          ),
          _buildFAQCard(
            '缺少DLL文件',
            '问题：在其他电脑上运行时提示缺少某些DLL文件。',
            '解决方案：\n1. 确保使用了 --standalone 模式\n2. 安装 Microsoft Visual C++ Redistributable\n3. 使用 --include-data-dir 包含必要的DLL\n4. 检查目标系统的架构（32位/64位）',
          ),
          _buildFAQCard(
            'NumPy/SciPy相关错误',
            '问题：使用NumPy、SciPy等科学计算库时出现错误。',
            '解决方案：\n1. 启用numpy插件：--enable-plugin=numpy\n2. 包含相关模块：--include-module=numpy,scipy\n3. 确保使用兼容的Python版本\n4. 检查BLAS库的配置',
          ),
        ],
      ),
    );
  }

  Widget _buildTutorialTab() {
    return SingleChildScrollView(
      padding: const EdgeInsets.all(16),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          _buildTutorialCard('📋 程序执行步骤详解', Icons.list_alt, [
            '第一步：环境准备',
            '• 确保Python 3.6+已安装并可正常使用',
            '• 检查Nuitka是否已安装：pip show nuitka',
            '• 如未安装：pip install nuitka',
            '',
            '第二步：选择项目文件',
            '• 点击主页"新建项目"按钮',
            '• 或导航到左侧"项目设置"页面',
            '• 点击"选择Python文件"浏览选择.py文件',
            '• 确认输出目录设置（默认为文件所在目录）',
            '',
            '第三步：配置构建参数（推荐）',
            '• 导航到"构建配置"页面',
            '• 选择构建模式：单文件模式或目录模式',
            '• 设置优化级别：推荐"高级优化"',
            '• 根据需要选择插件和包含的模块',
            '• 设置Windows控制台模式（GUI应用选择"禁用"）',
            '',
            '第四步：获取AI建议（强烈推荐）',
            '• 导航到"AI建议"页面',
            '• 点击"分析代码"按钮让AI分析您的项目',
            '• 查看AI提供的构建建议和优化建议',
            '• 点击"应用建议"自动应用推荐配置',
            '',
            '第五步：开始构建',
            '• 方法1：点击主页的大型"开始构建"按钮',
            '• 方法2：导航到"构建监控"页面点击"开始构建"',
            '• 实时查看构建进度条和详细日志输出',
            '• 可随时点击"复制日志"保存构建信息',
            '',
            '第六步：完成和测试',
            '• 等待显示"构建成功"消息',
            '• 在指定的输出目录中找到生成的.exe文件',
            '• 双击运行测试程序功能是否正常',
            '• 如有问题，查看构建日志排查错误原因',
          ]),
          _buildTutorialCard('1. 基础使用教程', Icons.play_arrow, [
            '步骤1：安装Nuitka\npip install nuitka',
            '步骤2：准备Python项目\n确保项目可以正常运行：python main.py',
            '步骤3：基础编译\nnuitka --standalone main.py',
            '步骤4：测试可执行文件\n运行生成的exe文件验证功能',
          ]),
          _buildTutorialCard('2. GUI应用程序编译', Icons.desktop_windows, [
            '步骤1：隐藏控制台窗口\nnuitka --standalone --windows-console-mode=disable main.py',
            '步骤2：添加应用图标\nnuitka --standalone --windows-console-mode=disable --windows-icon-from-ico=icon.ico main.py',
            '步骤3：启用GUI插件（如果使用tkinter）\nnuitka --standalone --enable-plugin=tk-inter --windows-console-mode=disable main.py',
            '步骤4：优化文件大小\n添加 --lto=yes 参数进行优化',
          ]),
          _buildTutorialCard('3. 科学计算应用编译', Icons.calculate, [
            '步骤1：启用科学计算插件\nnuitka --standalone --enable-plugin=numpy main.py',
            '步骤2：包含必要模块\n添加 --include-module=numpy,pandas,matplotlib',
            '步骤3：处理数据文件\n使用 --include-data-files 包含数据文件',
            '步骤4：测试数值计算功能\n验证所有科学计算功能正常工作',
          ]),
          _buildTutorialCard('4. Web应用编译（Flask/Django）', Icons.web, [
            '步骤1：包含Web框架\nnuitka --standalone --include-module=flask main.py',
            '步骤2：包含模板和静态文件\n使用 --include-data-dir=templates --include-data-dir=static',
            '步骤3：处理依赖项\n确保所有Web依赖都被正确包含',
            '步骤4：配置运行环境\n设置正确的工作目录和环境变量',
          ]),
        ],
      ),
    );
  }

  Widget _buildBestPracticesTab() {
    return SingleChildScrollView(
      padding: const EdgeInsets.all(16),
      child: Column(
        children: [
          _buildBestPracticeCard('🚀 性能优化', [
            '使用虚拟环境：创建干净的Python环境，只安装必要的包',
            '启用LTO优化：添加 --lto=yes 参数可显著减小文件大小',
            '合理选择模式：GUI应用使用standalone，命令行工具可考虑onefile',
            '并行编译：使用 --jobs=N 参数利用多核CPU加速编译',
            '缓存编译结果：Nuitka会缓存编译结果，重复编译会更快',
          ]),
          _buildBestPracticeCard('📦 依赖管理', [
            '最小化依赖：只导入真正需要的模块，避免导入整个包',
            '延迟导入：在函数内部导入模块，减少启动时间',
            '显式包含：对于动态导入的模块，使用 --include-module 显式包含',
            '排除无用模块：使用 --nofollow-import-to 排除不需要的大型依赖',
            '测试依赖：在目标环境中测试，确保所有依赖都正确包含',
          ]),
          _buildBestPracticeCard('🔧 开发流程', [
            '渐进式编译：先用基础参数编译，再逐步添加优化选项',
            '版本控制：记录成功的编译参数配置，便于重现',
            '自动化构建：编写脚本自动化编译流程，提高效率',
            '交叉测试：在不同Windows版本上测试编译结果',
            '文档记录：记录特殊配置和解决方案，便于团队协作',
          ]),
          _buildBestPracticeCard('🛡️ 错误处理', [
            '详细日志：使用 --verbose 参数获取详细的编译信息',
            '分步调试：遇到问题时，逐步添加参数定位问题',
            '环境隔离：使用Docker或虚拟机确保编译环境一致性',
            '备份策略：保留工作版本的配置，避免配置丢失',
            '社区支持：遇到问题时查阅Nuitka官方文档和社区讨论',
          ]),
          _buildBestPracticeCard('📋 发布准备', [
            '完整测试：在干净的系统上测试最终的可执行文件',
            '文件签名：为exe文件添加数字签名，提高用户信任度',
            '安装包制作：使用NSIS或Inno Setup制作专业的安装程序',
            '版本管理：在文件属性中添加版本信息和公司信息',
            '用户文档：提供清晰的安装和使用说明',
          ]),
        ],
      ),
    );
  }

  Widget _buildSectionCard(String title, IconData icon, List<Widget> children) {
    return Card(
      elevation: 2,
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              children: [
                Icon(icon, size: 24),
                const SizedBox(width: 8),
                Text(
                  title,
                  style: const TextStyle(
                    fontSize: 20,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ],
            ),
            const SizedBox(height: 16),
            ...children,
          ],
        ),
      ),
    );
  }

  Widget _buildParameterItem(
    String parameter,
    String name,
    String description,
    String example,
  ) {
    return Container(
      margin: const EdgeInsets.only(bottom: 16),
      padding: const EdgeInsets.all(12),
      decoration: BoxDecoration(
        border: Border.all(color: Colors.grey.shade300),
        borderRadius: BorderRadius.circular(8),
      ),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Row(
            children: [
              Container(
                padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4),
                decoration: BoxDecoration(
                  color: Colors.blue.shade100,
                  borderRadius: BorderRadius.circular(4),
                ),
                child: Text(
                  parameter,
                  style: const TextStyle(
                    fontFamily: 'Consolas',
                    fontWeight: FontWeight.bold,
                    color: Colors.blue,
                  ),
                ),
              ),
              const SizedBox(width: 8),
              Text(
                name,
                style: const TextStyle(
                  fontWeight: FontWeight.bold,
                  fontSize: 16,
                ),
              ),
            ],
          ),
          const SizedBox(height: 8),
          Text(
            description,
            style: TextStyle(color: Colors.grey.shade700, height: 1.4),
          ),
          const SizedBox(height: 8),
          Container(
            width: double.infinity,
            padding: const EdgeInsets.all(8),
            decoration: BoxDecoration(
              color: Colors.grey.shade100,
              borderRadius: BorderRadius.circular(4),
            ),
            child: Text(
              example,
              style: const TextStyle(fontFamily: 'Consolas', fontSize: 12),
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildFAQCard(String question, String problem, String solution) {
    return Card(
      margin: const EdgeInsets.only(bottom: 16),
      child: ExpansionTile(
        title: Text(
          question,
          style: const TextStyle(fontWeight: FontWeight.bold),
        ),
        children: [
          Padding(
            padding: const EdgeInsets.all(16),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text(
                  problem,
                  style: TextStyle(
                    color: Colors.red.shade700,
                    fontWeight: FontWeight.w500,
                  ),
                ),
                const SizedBox(height: 12),
                Text(solution, style: const TextStyle(height: 1.5)),
              ],
            ),
          ),
        ],
      ),
    );
  }

  Widget _buildTutorialCard(String title, IconData icon, List<String> steps) {
    return Card(
      margin: const EdgeInsets.only(bottom: 16),
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Row(
              children: [
                Icon(icon, color: Colors.green),
                const SizedBox(width: 8),
                Text(
                  title,
                  style: const TextStyle(
                    fontSize: 18,
                    fontWeight: FontWeight.bold,
                  ),
                ),
              ],
            ),
            const SizedBox(height: 16),
            ...steps.asMap().entries.map((entry) {
              int index = entry.key;
              String step = entry.value;
              return Padding(
                padding: const EdgeInsets.only(bottom: 12),
                child: Row(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  children: [
                    Container(
                      width: 24,
                      height: 24,
                      decoration: BoxDecoration(
                        color: Colors.green,
                        borderRadius: BorderRadius.circular(12),
                      ),
                      child: Center(
                        child: Text(
                          '${index + 1}',
                          style: const TextStyle(
                            color: Colors.white,
                            fontSize: 12,
                            fontWeight: FontWeight.bold,
                          ),
                        ),
                      ),
                    ),
                    const SizedBox(width: 12),
                    Expanded(
                      child: Text(step, style: const TextStyle(height: 1.4)),
                    ),
                  ],
                ),
              );
            }).toList(),
          ],
        ),
      ),
    );
  }

  Widget _buildBestPracticeCard(String title, List<String> practices) {
    return Card(
      margin: const EdgeInsets.only(bottom: 16),
      child: Padding(
        padding: const EdgeInsets.all(16),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text(
              title,
              style: const TextStyle(fontSize: 18, fontWeight: FontWeight.bold),
            ),
            const SizedBox(height: 12),
            ...practices
                .map(
                  (practice) => Padding(
                    padding: const EdgeInsets.only(bottom: 8),
                    child: Row(
                      crossAxisAlignment: CrossAxisAlignment.start,
                      children: [
                        const Icon(
                          Icons.check_circle,
                          color: Colors.green,
                          size: 16,
                        ),
                        const SizedBox(width: 8),
                        Expanded(
                          child: Text(
                            practice,
                            style: const TextStyle(height: 1.4),
                          ),
                        ),
                      ],
                    ),
                  ),
                )
                .toList(),
          ],
        ),
      ),
    );
  }
}
